package com.example.mspay.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.example.mspay.service.AlipayService;
import com.example.mspay.service.OrderServiceFeignClient;
import com.wg.msorderds.service.ProductFeignClient;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 支付宝支付控制器
 * 处理支付请求、订单查询和异步通知
 */
@RestController
@RequestMapping("/alipay")
@RequiredArgsConstructor
public class AlipayController {


    /**
     * 支付服务类，用于处理具体的支付逻辑
     * 使用@Autowired注解进行依赖注入
     */
    @Autowired
    private AlipayService alipayService;
    @Autowired
    private OrderServiceFeignClient orderServiceFeignClient;

    /**
     * 发起支付请求
     *
     * @param orderNo 订单编号
     * @param amount 支付金额
     * @param subject 商品标题
     * @return 支付页面HTML代码
     * @throws AlipayApiException 支付宝API调用异常
     */
    @GetMapping("/pay")
    public String pay(@RequestParam String orderNo,
                      @RequestParam BigDecimal amount,
                      @RequestParam String subject) throws AlipayApiException {
        return alipayService.createOrder(orderNo, amount, subject);
    }

    /**
     * 查询订单支付状态
     *
     * @param orderNo 订单编号
     * @return 订单查询结果
     * @throws AlipayApiException 支付宝API调用异常
     */
    @GetMapping("/query")
    public String query(@RequestParam String orderNo) throws AlipayApiException {
        return alipayService.queryOrder(orderNo);
    }

    /**
     * 支付宝异步通知处理接口
     * 接收支付宝服务器发送的支付结果通知
     *
     * @param request HTTP请求对象，包含支付宝发送的通知参数
     * @return 处理结果，返回"success"表示处理成功，"failure"表示处理失败
     */
    @PostMapping("/notify")
    public String notify(HttpServletRequest request) {
        System.out.println("收到支付宝异步通知");
        // 将请求参数转换为Map格式，方便后续处理
        Map<String, String> params = request.getParameterMap().entrySet().stream()
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        e -> String.join(",", e.getValue())
                ));

        try {
            // 使用支付宝SDK验证签名，确保通知来自支付宝服务器
            boolean signVerified = AlipaySignature.rsaCheckV1(
                    params,
                    "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhuFmvZzlDQuGqxD6xvFhDI5BY0NWaKox1mmyxphOe9CulMIwSX18ikr8S41f8PUvfmWSPxgyDE2V5Pcwyqc1g7ByfOEQykolY/IcFoeVkJNJz59oHg4VfdCBph9ASM5wC+ARiYu9GttEzq1mRbCOQ4A2yonlNeUyHDW7o9tpM8o/tHrHBG6nRryTk03bXWhKwl2CBcofoBqHZTaQKeuw470RZEPCnD2ptM0lVlcf2wzPCU4xh4tTZoaKNXFCpn8i2KOKb9cPjNjgipGBWC3yGAckvjWknHdS1Frx9ioax/t6IB49hleFE2hRzZBZ4xX4k4vaqXx5RI/Oei0+RadVrQIDAQAB",
                    "UTF-8",
                    "RSA2"
            );

            // 如果签名验证通过
            if (signVerified) {
                // 获取交易状态
                String tradeStatus = params.get("trade_status");
                // 如果支付成功
                if ("TRADE_SUCCESS".equals(tradeStatus)) {
                    // 输出支付成功日志，实际项目中应更新订单状态等业务处理
                    System.out.println(request.toString());
                    System.out.println("支付成功");
                }
                // 返回success告知支付宝服务器已成功接收通知
                return "success";
            }
        } catch (Exception e) {
            // 签名验证失败或处理异常
            System.out.println("验签失败");
        }
        // 返回failure表示处理失败
        return "failure";
    }
}
